package com.granada.utils;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;
 
/**
 * AES加密
 * @author liuyazhuang
 *
 */
public class AES {
	public static boolean initialized = false;

		/**
		 * AES解密
		 *
		 * @param content 密文
		 * @return
		 * @throws InvalidAlgorithmParameterException
		 * @throws NoSuchProviderException
		 */
		public static byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte)
				throws InvalidAlgorithmParameterException {
			initialize();
			try {
				Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
				Key sKeySpec = new SecretKeySpec(keyByte, "AES");

				cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
				byte[] result = cipher.doFinal(content);
				return result;
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (NoSuchPaddingException e) {
				e.printStackTrace();
			} catch (InvalidKeyException e) {
				e.printStackTrace();
			} catch (IllegalBlockSizeException e) {
				e.printStackTrace();
			} catch (BadPaddingException e) {
				e.printStackTrace();
			} catch (NoSuchProviderException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
		}

		public static void initialize() {
			if (initialized) return;
			Security.addProvider(new BouncyCastleProvider());
			initialized = true;
		}

		/**
		 * 生成iv
		 *
		 * @param iv
		 * @return
		 * @throws Exception
		 * @see
		 */
		public static AlgorithmParameters generateIV(byte[] iv)
				throws Exception {
			AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
			params.init(new IvParameterSpec(iv));
			return params;
		}

	}

